简介
单例模式是指整个应用中类只有一个对象实例的设计模式。它通常被用来创建对象,确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
它是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。
特点
一个类在整个应用中有且只有一个实例
类必须自行创建这个实例
必须自行向整个系统提供这个实例
作用
使用单例模式最大的作用就是能减少系统开销,节约资源。比如我们在使用php进行日常开发中,经常需要多次连接MySQL或redis等各种关系型、非关系型数据库,如果不使用单例模式,则需多次进行new创建新的实例,都会消耗大量的内存资源和系统资源。
要点
1、需要一个保存类的唯一实例的静态成员变量
private static $_instance;
2、构造函数和克隆函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
// 私有化构造方法,防止new实例
private function __construct()
{
$this->_db = pg_connect('demo');
}
// 覆盖__clone()方法,禁止克隆
private function __clone()
{
}
3、必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
// 用于返回对象实例的公共静态方法
public static function getInstance()
{
// 判断当前实例是否已经创建
if (!(self::$_instance instanceof self) ) {
// 如果没有,则创建
self::$_instance = new self();
}
// 最终返回实例
return self::$_instance;
}
讲解
下面我就以一个MySQL操作类为例给大家演示下它的写法。
代码:
<?php
/**
* Class DB 数据库操作类
*/
class Db
{
private $_db;
private static $_instance;
// 私有化构造方法,防止外部new实例
private function __construct(...)
{
// 这里主要用于连接数据库,细节此处省略
$this->_db = pg_connect(...);
}
// 覆盖__clone()方法,禁止克隆
private function __clone()
{
}
// 返回对象实例
public static function getInstance()
{
// 判断是否存在对象实例
if(! (self::$_instance instanceof self) ) {
// 不存在则创建保存
self::$_instance = new self();
}
// 返回对象实例
return self::$_instance;
}
// 其他方法
public function addUserInfo(...)
{
}
// 其他方法
public function getUserInfo(...)
{
}
}
// 演示
$db = Db::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);
总结
讲了这么多单例模式的内容,可不是说它没有缺点哦,下面我列出了使用单例模式的优缺点,大家看下,可以根据实际需求选择使用。
单例模式的优缺点:
优点:
改进系统的设计
是对全局变量的一种改进
节省系统资源开销
缺点:
难于调试
隐藏的依赖关系
无法用错误类型的数据覆写一个单例
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。